package Principal;
import java.io.Serializable;
import java.util.*;

	/**
	 * Sommet est une classe représentant le sommet d'un graphe.
	 * Sommet est carractérisé par un nom, une liste de voisins sortants et un rank.
	 * Le voisin sortant d'un Sommet A est un Sommet B relié au Sommet A par un arc.
	 * Sommet est une classe abstraite qui implémente l'interface Serializable.
	 */

public abstract class Sommet implements Serializable {
	
	/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

	/**
	 * Le nom du Sommet.
	 */
	protected String nom;
	
	/**
	 * La liste des voisins sortants du Sommet.
	 */
	protected List<Sommet> voisinsSortants;
	
	/**
	 * Le rank du Sommet.
	 */
	private double rank;
	
	/**
	 * Constructeur de Sommet.
	 * @param nom1
	 *		Le nom du Sommet créé.
	 * A la construction d'un objet Sommet, une liste de ses voisins sortants est créée.
	 */
	public Sommet(String nom1) {		
		nom = nom1;
		voisinsSortants = new ArrayList<Sommet>();
	}
	
	/**
	 * Ajoute un voisin sortant à la liste de voisins sortants du Sommet.
	 * Un voisin sortant est un sommet donc
	 * @param sommet
	 */
	public void ajoutVoisinSortant(Sommet sommet){
		voisinsSortants.add(sommet);
	}

	/**
	 * Donne le nombre de voisins sortants actuels du Sommet.
	 * @return le nombre de voisins sortants de la liste VoisinsSortants.
	 */
	public int nbVoisinsSortants() {
		return voisinsSortants.size();
	}

	/**
	 * Retourne la liste des voisins sortants.
	 * @return la liste des voisins sortants du Sommet.
	 */
	public List<Sommet> getVoisinsSortants() {
		return voisinsSortants;
	}

	/**
	 * Met à jour la liste de voisins sortants
	 * @param voisinsSortants
	 */
	public void setVoisinsSortants(List<Sommet> voisinsSortants) {
		this.voisinsSortants = voisinsSortants;
	}
	
	
	/**
	 * Compare le nom de deux sommets par ordre alphabetique.
	 * @param s1 un premier sommet
	 * @param s2 un deuxieme sommet 
	 * @return -1 si le nom de s1 est avant le nom de s2 dans l'ordre alphabetique, 0 s'ils ont le meme nom
	 * 1 si le nom de s1 est après le nom de s2 dans l'ordre alphabetique
	 */
	public static int comparerAlpha(Sommet s1, Sommet s2){
		return (s1.nom).compareTo(s2.nom);
	}
	
	
	/**
	 * Compare le nombre de voisins sortants de deux sommets
	 * @param s1 un premier sommet
	 * @param s2 un deuxieme sommet 
	 * @return -1 si le nombre de voisins sortants de s1 est inférieur à celui de s2
	 * 0 s'ils ont le meme nombre de voisins sortants
	 * 1 si le nombre de voisins sortants de s1 est supérieur à celui de s2
	 */
	public static int nbVoisinSortantCompar(Sommet s1, Sommet s2)
	{
		if (s1.nbVoisinsSortants() < s2.nbVoisinsSortants()) return -1;
		else if (s1.nbVoisinsSortants() == s2.nbVoisinsSortants()) return 0;
		else  return 1;
		
	}
	
	/**
	 * supprime le voisin sortant de la liste des voisin sortant
	 * @param nom nom du voisin sortant qu'on veux supprimer
	 */
	public void supprimerVoisinSortant(String nom1)
	{
			for (int i=0; i<voisinsSortants.size()-1; i++) {
				if ((voisinsSortants.get(i).nom).compareTo(nom1)==0){
					voisinsSortants.remove(i);
				}
			}
	}

	public double getRank() {
		return rank;
	}

	public void setRank(double rank) {
		this.rank = rank;
	}

	public String getNom() {
		return nom;
	}

}
